#include <bits/stdc++.h>
using namespace std;

/*
1957. 删除字符使字符串变好
已解答
简单
相关标签
premium lock icon
相关企业
提示
一个字符串如果没有 三个连续 相同字符，那么它就是一个 好字符串 。

给你一个字符串 s ，请你从 s 删除 最少 的字符，使它变成一个 好字符串 。

请你返回删除后的字符串。题目数据保证答案总是 唯一的 。

 

示例 1：

输入：s = "leeetcode"
输出："leetcode"
解释：
从第一组 'e' 里面删除一个 'e' ，得到 "leetcode" 。
没有连续三个相同字符，所以返回 "leetcode" 。
示例 2：

输入：s = "aaabaaaa"
输出："aabaa"
解释：
从第一组 'a' 里面删除一个 'a' ，得到 "aabaaaa" 。
从第二组 'a' 里面删除两个 'a' ，得到 "aabaa" 。
没有连续三个相同字符，所以返回 "aabaa" 。
示例 3：

输入：s = "aab"
输出："aab"
解释：没有连续三个相同字符，所以返回 "aab" 。
 

提示：

1 <= s.length <= 105
s 只包含小写英文字母。
*/

// 法一
class Solution {
public:
    string makeFancyString(string s) {
        string ans;
        int cnt = 0;
        char pre = '\0'; // 记录前一个字符 初始化为null

        for (char ch : s) {
            if (ch == pre) {
                cnt++;
                // 只添加两个连续的 后面的跳过
                if (cnt < 3)
                    ans += ch;

            } else {
                // 当前字符与前一个不同 就说明出现了新字符
                ans += ch;
                cnt = 1; // 这个情况要重置
                pre = ch;
            }
        }
        return ans;
    }
};

// 法二
class Solution {
public:
    string makeFancyString(string s) {
        string ans;
        for (char ch : s) {
            // 性能优化 一个判断 直接解决 判断与添加字符等操作在一次出来
            if (ans.size() >= 2 && ans[ans.size() - 1] == ch && ans[ans.size() - 2] == ch)
                continue;       // 不添加当前字符 避免三个连续

            // 不然就push进结果字符串中 此时最多两个连续相同字符
            ans.push_back(ch);
        }
        return ans;
    }
};